package com.ihrm.system.service;

import com.ihrm.common.service.BaseService;
import com.ihrm.common.utils.IdWorker;
import com.ihrm.domain.system.Role;
import com.ihrm.domain.system.User;
import com.ihrm.system.dao.RoleDao;
import com.ihrm.system.dao.UserDao;
import com.ihrm.system.utils.BaiduAiUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.Base64Utils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.IOException;
import java.util.*;

/**
 * @auther chongxiongwei
 * @create 2020-04-16-23:00
 */
@Service
public class UserService extends BaseService {

    @Autowired
    private UserDao userDao;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private RoleDao roleDao;

    //分配角色
    public void assignRoles(String userID,List<String > roleIds){

        //1.根据id查询用户
        User temp = userDao.findById(userID).get();
        //2.设置用户的角色集合
        Set<Role> roles = new HashSet<>();
        for (String roleId : roleIds) {
            // 判断roleid 查询的对象是否存在
            Role role = roleDao.findById(roleId).get();
            roles.add(role);
        }
        // 设置用户和角色之间的关系
        temp.setRoles(roles);
        //3.更新用户
        userDao.save(temp);
    }

    //保存用户
    public void save(User user){
        String id = idWorker.nextId()+"";
        user.setId(id);
        user.setPassword("123456");
        user.setEnableState(1);
        user.setCreateTime(new Date(System.currentTimeMillis()));
        userDao.save(user);
    }

    //更新用户
    public void update(User user){
        // 先根据ID查询要更新的用户
        User temp = userDao.findById(user.getId()).get();
        // 设置更新后的属性
        temp.setUsername(user.getUsername());
        temp.setPassword(user.getPassword());
        temp.setDepartmentId(user.getDepartmentId());
        temp.setDepartmentName(user.getDepartmentName());
        userDao.save(temp);
    }

    //删除用户
    public void delete(String id){
        userDao.deleteById(id);
    }

    //根据用户ID查询用户
    public User findById(String id){
        return userDao.findById(id).get();
    }

    /**
     * //根据部门ID 及多字段条件分页查询用户
     *   map集合的形式
     *      hasDept
     *      departmentId
     *      companyId
     */
    public Page<User> findAll(Map<String,Object> map, int page, int size){
        // 1.需要查询的条件
        Specification<User> specification = new Specification<User>() {
            /**
             * 动态拼接查询条件
             * @param root
             * @param criteriaQuery
             * @param criteriaBuilder
             * @return
             */
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List<Predicate> list = new ArrayList<>();
                // 根据请求的companyId是否为空构造查询条件
                if(!StringUtils.isEmpty(map.get("companyId"))){
                    list.add(criteriaBuilder.equal(root.get("companyId").as(String.class),(String)map.get("companyId")));
                }
                // 根据请求的departmentId 是否为空构造查询条件
                if(!StringUtils.isEmpty(map.get("departmentId"))){
                    list.add(criteriaBuilder.equal(root.get("departmentId").as(String.class),(String)map.get("departmentId")));
                }
                // 根据请求的 hasdept来判断  0未分配 （departmentId = null） 1已分配 departmentId != null）
                if(!StringUtils.isEmpty(map.get("hasDept"))){
                    if("0".equals((String) map.get("hasDept"))){
                        list.add(criteriaBuilder.isNull(root.get("departmentId")));
                    }else{
                        list.add(criteriaBuilder.isNotNull(root.get("departmentId")));
                    }
                }
//                list.toArray(new Predicate[list.size()])
                return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
            }
        };

        // 2.分页   --返回page 对象
        Page<User> userPage = userDao.findAll(specification, PageRequest.of(page -1, size));


        return userPage;
    }

    /**
     *  根据mobile查询用户
     */
    public User findByMobile(String mobile){
        return userDao.findByMobile(mobile);
    }

    /**
     *  根据mobile查询用户
     */
    public User findByName(String username){
        return userDao.findByUsername(username);
    }

    @Autowired
    private BaiduAiUtil baiduAiUtil;
    /**
     * 图片处理
     * @param id    用户ID
     * @param file  用户上传的头像文件
     * @return      请求路径
     *
     *  // 将图片注册到百度人脸库中
     *     1.先判断用户是否已注册，已注册更新，未注册创建
     */
    public String uploadImage(String id, MultipartFile file) throws IOException {
        // 1.根据id查询用户
        User user = userDao.findById(id).get();
        // 2.使用dataurl的形式存储图片（对图片byte数组进行base64编码）
        String encode = "data:image/png;base64,"+ Base64Utils.encodeToString(file.getBytes());
        // 3.更新用户头像地址
        user.setStaffPhoto(encode);
        userDao.save(user);

        //  判断是否已经注册面部信息
        boolean b = baiduAiUtil.faceExist(id);
        String imageBase64 = Base64Utils.encodeToString(file.getBytes());
        if(b){
            // 存在更新
            baiduAiUtil.faceUpdate(id,imageBase64);
        }else {
            // 不存在注册
            baiduAiUtil.faceRegister(id,imageBase64);
        }

        // 4. 返回
        return encode;
    }
}
